package com.ffggffgfv.backend.controller;

import com.ffggffgfv.backend.dto.UserRegisterDTO;
import com.ffggffgfv.backend.dto.UserUpdateDTO;
import com.ffggffgfv.backend.entity.User;
import com.ffggffgfv.backend.service.UserService;
import com.ffggffgfv.backend.util.JWTUtil;
import com.ffggffgfv.backend.util.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * 用户控制器
 */
@RestController
@RequestMapping("/api/users")
public class UserController {

    @Autowired
    private UserService userService;

    @Autowired
    private JWTUtil jwtUtil;

    /**
     * 查询所有用户
     *
     * @return 用户列表
     */
    @GetMapping("/all")
    public Result getAllUsers() {
        List<User> users = userService.findAll();
        return Result.success(users, "获取用户列表成功");
    }

    /**
     * 用户注册
     *
     * @param userRegisterDTO 用户注册信息
     * @return 注册结果
     */
    @PostMapping("/register")
    public Result register(@RequestBody UserRegisterDTO userRegisterDTO) {
        // 参数验证
        if (userRegisterDTO.getUsername() == null || userRegisterDTO.getUsername().trim().isEmpty()) {
            return Result.validateFailed("用户名不能为空");
        }
        if (userRegisterDTO.getPhone() == null || userRegisterDTO.getPhone().trim().isEmpty()) {
            return Result.validateFailed("手机号不能为空");
        }
        if (userRegisterDTO.getPassword() == null || userRegisterDTO.getPassword().length() < 6) {
            return Result.validateFailed("密码不能为空且长度不能小于6位");
        }

        // 检查用户名是否已存在
        if (userService.isUsernameExists(userRegisterDTO.getUsername())) {
            return Result.conflict("用户名已存在");
        }

        // 检查手机号是否已存在
        if (userService.isPhoneExists(userRegisterDTO.getPhone())) {
            return Result.conflict("手机号已被注册");
        }

        // 检查邮箱是否已存在
        if (userRegisterDTO.getEmail() != null && !userRegisterDTO.getEmail().trim().isEmpty() &&
                userService.isEmailExists(userRegisterDTO.getEmail())) {
            return Result.conflict("邮箱已被注册");
        }

        try {
            User registeredUser = userService.register(userRegisterDTO);
            return Result.success(registeredUser, "注册成功");
        } catch (Exception e) {
            return Result.internalError("注册失败: " + e.getMessage());
        }
    }

    /**
     * 获取用户详情
     *
     * @param id 用户ID
     * @return 用户详情
     */
    @GetMapping("/{id}")
    public Result getUserDetail(@PathVariable Long id) {
        Map<String, Object> userDetail = userService.getUserDetail(id);
        if (userDetail == null) {
            return Result.validateFailed("用户不存在");
        }
        return Result.success(userDetail, "获取用户详情成功");
    }

    /**
     * 更新用户信息
     *
     * @param id            用户ID
     * @param userUpdateDTO 用户更新信息
     * @param token         JWT令牌
     * @return 更新结果
     */
    @PutMapping("/{id}")
    public Result updateUser(
            @PathVariable Long id,
            @RequestBody UserUpdateDTO userUpdateDTO,
            @RequestHeader(value = "Authorization", required = false) String token) {

        // 验证权限：只有管理员或用户本人可以更新用户信息
        boolean isAuthorized = false;

        if (token != null && token.startsWith("Bearer ")) {
            token = token.substring(7);
            try {
                // 从令牌中提取用户ID
                Long tokenUserId = jwtUtil.getUserIdFromToken(token);

                // 如果令牌中的用户ID与请求路径中的ID一致，则认为是用户本人操作
                if (tokenUserId != null && tokenUserId.equals(id)) {
                    isAuthorized = true;
                }

                // 这里可以添加更多权限检查，如检查是否为管理员
                // 如果项目中实现了RBAC权限系统，可以在此处检查角色
            } catch (Exception e) {
                return Result.unauthorized("无效的认证令牌");
            }
        }

        if (!isAuthorized) {
            return Result.unauthorized("您没有权限更新此用户信息");
        }

        // 验证请求参数
        if (userUpdateDTO.getPhone() == null &&
                userUpdateDTO.getEmail() == null &&
                userUpdateDTO.getAvatarUrl() == null &&
                (userUpdateDTO.getOldPassword() == null || userUpdateDTO.getNewPassword() == null)) {
            return Result.validateFailed("没有提供需要更新的信息");
        }

        // 更新用户信息
        User updatedUser = userService.updateUser(id, userUpdateDTO);

        if (updatedUser == null) {
            return Result.validateFailed("更新失败，请检查提供的信息是否正确");
        }

        return Result.success(updatedUser, "用户信息更新成功");
    }
}
